home *** CD-ROM | disk | FTP | other *** search
/ System Booster / System Booster.iso / Archives / ForCLI / Kill.lha / Kill.c < prev    next >
C/C++ Source or Header  |  1994-07-31  |  8KB  |  306 lines

  1. /*
  2. ** $VER: Kill.c 1.97 (31.7.94)
  3. **
  4. ** Beinahe dasselbe wie C:delete, nur daß man zusätzlich wie bei
  5. ** List SINCE und UPTO angeben kann
  6. ** (und das Programm informativer ist (bei löschgeschützten Files))
  7. **
  8. ** © Copyright 1994 by Walter Dörwald
  9. **   Alle Rechte vorbehalten
  10. */
  11.  
  12. #include <exec/memory.h>
  13. #include <dos/datetime.h>
  14. #include <clib/macros.h>
  15. #include <proto/exec.h>
  16. #include <proto/dos.h>
  17. #include <proto/intuition.h>
  18.  
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21.  
  22. #include <privat/Defs.h>
  23. #include <privat/Auto.h>
  24. #include <privat/Proto.h>
  25.  
  26. #include <debug/debug.h>
  27.  
  28. // !!! Wo ist denn dieses FORMAT_DEF definiert? (in dos.library/StrToDate() ist's jedenfalls dokumentiert)
  29.  
  30. #include "rev.h"
  31.  
  32. #define PROGRAM "Kill"
  33.  
  34. #define ARG_TEMPLATE "FILE/M/A,ALL/S,QUIET/S,FORCE/S,SINCE/K,UPTO/K,SINCEDAYS/K/N,UPTODAYS/K/N,BIGGER/K/N,SMALLER/K/N"
  35. #define ARG_FILE         0
  36. #define ARG_ALL          1
  37. #define ARG_QUIET        2
  38. #define ARG_FORCE        3
  39. #define ARG_SINCE        4
  40. #define ARG_UPTO         5
  41. #define ARG_SINCEDAYS    6
  42. #define ARG_UPTODAYS     7
  43. #define ARG_BIGGER       8
  44. #define ARG_SMALLER      9
  45. #define ARG_sizeof       10
  46.  
  47. #define ISDIR(AP) (((AP)->ap_Info.fib_DirEntryType >= 0) && ((AP)->ap_Info.fib_DirEntryType != ST_SOFTLINK))
  48.  
  49. static const char Version[] = "$VER: " PROGRAM " " VERSION_STR "." REVISION_STR " (" HEUTE_STR ")";
  50.  
  51. struct RDArgs *ArgsPtr;
  52. UBYTE *ArgArray[ARG_sizeof];
  53.  
  54. struct DateStamp Jetzt;
  55. struct DateStamp Since;
  56. struct DateStamp Upto;
  57. struct DateStamp SinceDays;
  58. struct DateStamp UptoDays;
  59.  
  60. void DoExit(ULONG result)
  61. {
  62.     if (ArgsPtr)
  63.         FreeArgs(ArgsPtr);
  64.  
  65.     exit(result);
  66. }
  67.  
  68. void PrintError(LONG Error,STRPTR Text)
  69. {
  70.     D2(bug("Error=%ld, Text=»%s«\n",Error,Text));
  71.  
  72.     if (!ArgArray[ARG_QUIET])
  73.     {
  74.         if (!PrintFault(Error,Text))
  75.             MyPrintf("%s: Error %ld",Text,Error);
  76.     }
  77. }
  78.  
  79. LONG Kill(struct AnchorPath *AP)
  80. {
  81.     LONG Error;
  82.  
  83.     D2(bug("AP.ap_Buf=»%s«\n",AP->ap_Buf));
  84.     if (!ArgArray[ARG_QUIET])
  85.         MyPrintf("%s",AP->ap_Buf);
  86.  
  87.     if (AP->ap_Info.fib_Protection & FIBF_DELETE) // Beim löschgeschützten Files vorher entriegeln
  88.     {
  89.         if (ArgArray[ARG_FORCE]) // ... aber nur wenn es der Benutzer auch will
  90.         {
  91.             if (SetProtection(AP->ap_Info.fib_FileName,AP->ap_Info.fib_Protection & ~FIBF_DELETE))
  92.             {
  93.                 if (!ArgArray[ARG_QUIET])
  94.                     MyPrintf(" " CSI_STR "1munprotected" CSI_STR "0m and");
  95.             }
  96.             else
  97.             {
  98.                 D(bug("SetProtection() fehlgeschlagen\n"));
  99.                 PrintError(IoErr()," " CSI_STR "1mnot" CSI_STR "0m unprotected");
  100.                 return (RETURN_ERROR);
  101.             }
  102.         }
  103.         else
  104.         {
  105.             SetIoErr(ERROR_DELETE_PROTECTED);
  106.             PrintError(ERROR_DELETE_PROTECTED," " CSI_STR "1mnot" CSI_STR "0m deleted (use FORCE/S)");
  107.             return (RETURN_WARN);
  108.         }
  109.     }
  110.  
  111.     if (DeleteFile(AP->ap_Info.fib_FileName))
  112.     {
  113.         if (!ArgArray[ARG_QUIET])
  114.             MyPrintf(" deleted\n");
  115.         return (RETURN_OK);
  116.     }
  117.     else
  118.     {
  119.         D(bug("DeleteFile() fehlgeschlagen\n"));
  120.         Error = IoErr();
  121.         PrintError(Error," " CSI_STR "1mnot" CSI_STR "0m deleted");
  122.         return ((Error == ERROR_DIRECTORY_NOT_EMPTY) ? RETURN_WARN : RETURN_ERROR);
  123.     }
  124. }
  125.  
  126. LONG Do(struct AnchorPath *AP)
  127. {
  128.     if (ArgArray[ARG_SINCE] && (CompareDates(&Since,&AP->ap_Info.fib_Date)<0))
  129.     {
  130.         D2(bug("AP.ap_Buf=»%s« to old (SINCE/K) (DateStamp=={%ld,%ld,%ld})\n",AP->ap_Buf,AP->ap_Info.fib_Date.ds_Days,AP->ap_Info.fib_Date.ds_Minute,AP->ap_Info.fib_Date.ds_Tick));
  131.         return (RETURN_OK);
  132.     }
  133.     if (ArgArray[ARG_UPTO] && (CompareDates(&Upto,&AP->ap_Info.fib_Date)>0))
  134.     {
  135.         D2(bug("AP.ap_Buf=»%s« to new (UPTO/K) (DateStamp=={%ld,%ld,%ld})\n",AP->ap_Buf,AP->ap_Info.fib_Date.ds_Days,AP->ap_Info.fib_Date.ds_Minute,AP->ap_Info.fib_Date.ds_Tick));
  136.         return (RETURN_OK);
  137.     }
  138.     if (ArgArray[ARG_SINCEDAYS] && (CompareDates(&SinceDays,&AP->ap_Info.fib_Date)<0))
  139.     {
  140.         D2(bug("AP.ap_Buf=»%s« to old (SINCEDAYS/K) (DateStamp=={%ld,%ld,%ld})\n",AP->ap_Buf,AP->ap_Info.fib_Date.ds_Days,AP->ap_Info.fib_Date.ds_Minute,AP->ap_Info.fib_Date.ds_Tick));
  141.         return (RETURN_OK);
  142.     }
  143.     if (ArgArray[ARG_UPTODAYS] && (CompareDates(&UptoDays,&AP->ap_Info.fib_Date)>0))
  144.     {
  145.         D2(bug("AP.ap_Buf=»%s« to new (UPTODAYS/K) (DateStamp=={%ld,%ld,%ld})\n",AP->ap_Buf,AP->ap_Info.fib_Date.ds_Days,AP->ap_Info.fib_Date.ds_Minute,AP->ap_Info.fib_Date.ds_Tick));
  146.         return (RETURN_OK);
  147.     }
  148.     if (ArgArray[ARG_BIGGER] && !ISDIR(AP) && (AP->ap_Info.fib_Size<=*(LONG *)ArgArray[ARG_BIGGER]))
  149.     {
  150.         D2(bug("AP.ap_Buf=»%s« to small (BIGGER) (Size==%ld)\n",AP->ap_Buf,AP->ap_Info.fib_Size));
  151.         return (RETURN_OK);
  152.     }
  153.     if (ArgArray[ARG_SMALLER] && !ISDIR(AP) && (AP->ap_Info.fib_Size>=*(LONG *)ArgArray[ARG_SMALLER]))
  154.     {
  155.         D2(bug("AP.ap_Buf=»%s« to big (SMALLER) (Size==%ld)\n",AP->ap_Buf,AP->ap_Info.fib_Size));
  156.         return (RETURN_OK);
  157.     }
  158.  
  159.     return (Kill(AP));
  160. }
  161.  
  162. // Alle Unterverzeichnisse durchlaufen
  163. #define SB_ALL 0
  164. #define SF_ALL (1L<<SB_ALL)
  165.  
  166. // Alle Ausgaben unterdrücken
  167. #define SB_QUIET 1
  168. #define SF_QUIET (1L<<SB_QUIET)
  169.  
  170. LONG Scan(STRPTR *Files,LONGBITS BreakBits,LONGBITS Flags,LONG NameLen)
  171. {
  172.     struct AnchorPath *AP;
  173.     LONG               Error;
  174.     LONG               Level;
  175.     LONG               TestLevel;
  176.  
  177.     Level = RETURN_OK;
  178.  
  179.     if (AP = AllocVec(sizeof(struct AnchorPath)+NameLen,MEMF_ANY|MEMF_CLEAR))
  180.     {
  181.         AP->ap_BreakBits = BreakBits;
  182.         AP->ap_FoundBreak = 0;
  183.         AP->ap_Flags = APF_DOWILD;
  184.         AP->ap_Strlen = NameLen;
  185.  
  186.         for (;*Files;Files++)
  187.         {
  188.             for (Error = MatchFirst(*Files,AP);!Error;Error = MatchNext(AP))
  189.             {
  190.                 BPTR OldLock;
  191.  
  192.                 D2(bug("File »%s«, DateStamp {%ld,...}\n",AP->ap_Buf,AP->ap_Info.fib_Date.ds_Days));
  193.  
  194.                 if (AP->ap_Flags & APF_DIDDIR) // Directory fertig?
  195.                     AP->ap_Flags &= ~APF_DIDDIR;
  196.                 else if (ISDIR(AP)) // Ein Directory?
  197.                 {
  198.                     if (Flags & SF_ALL) // Rein in's Directory aber noch nicht löschen sondern erst bei Rückkehr
  199.                     {
  200.                         AP->ap_Flags |= APF_DODIR;
  201.                         continue;
  202.                     }
  203.                 }
  204.  
  205.                 OldLock = CurrentDir(AP->ap_Current->an_Lock);
  206.  
  207.                 TestLevel = Do(AP);
  208.                 Level = MAX(Level,TestLevel);
  209.  
  210.                 CurrentDir(OldLock);
  211.                 if (Level>RETURN_WARN)
  212.                     goto fertig;
  213.             }
  214.             MatchEnd(AP);
  215.             // Den Fehlerlevel zurückgeben
  216.             if (Error!=ERROR_NO_MORE_ENTRIES)
  217.                 Level = RETURN_ERROR;
  218.         }
  219.     }
  220.     else
  221.     {
  222.         D(bug("AllocVec() fehlgeschlagen: Kein Speicher für struct AnchorPath\n"));
  223.         return (RETURN_FAIL);
  224.     }
  225.     fertig:
  226.     FreeVec(AP);
  227.     return (Level);
  228. }
  229.  
  230. void main()
  231. {
  232.     LONG Level;
  233.     LONG Flags;
  234.     struct DateTime Zeit;
  235.  
  236.     D2(bug(CSI_STR "1mLos geht's" CSI_STR "0m\n"));
  237.  
  238.     DateStamp(&Jetzt);
  239.  
  240.     Zeit.dat_Format = FORMAT_DOS;
  241.     Zeit.dat_Flags = 0; // DTF_SUBST braucht laut dos.library/StrToDate() nicht gesetzt zu sein
  242.  
  243.     if (!(ArgsPtr = ReadArgs(ARG_TEMPLATE,(LONG *)&ArgArray,NULL)))
  244.     {
  245.         D(bug("ReadArgs() fehlgeschlagen\n"));
  246.         PrintFault(IoErr(),PROGRAM "(parsing arguments)");
  247.         DoExit(RETURN_ERROR);
  248.     }
  249.  
  250.     Flags = 0L;
  251.     if (ArgArray[ARG_ALL])
  252.         Flags |= SF_ALL;
  253.     if (ArgArray[ARG_QUIET])
  254.         Flags |= SF_QUIET;
  255.     if (ArgArray[ARG_SINCE])
  256.     {
  257.         Zeit.dat_StrDate = ArgArray[ARG_SINCE];
  258.         if (!StrToDate(&Zeit))
  259.         {
  260.             D(bug("StrToDate() fehlgeschlagen (bei ARG_SINCE)\n"));
  261.             PrintFault(ERROR_OBJECT_WRONG_TYPE,PROGRAM "(parsing SINCE/K)");
  262.             DoExit(RETURN_ERROR);
  263.         }
  264.         Zeit.dat_Stamp.ds_Minute = 0;
  265.         Zeit.dat_Stamp.ds_Tick = 0;
  266.         Since = Zeit.dat_Stamp;
  267.  
  268.         D2(bug("Since=={%ld,%ld,%ld}\n",Since.ds_Days,Since.ds_Minute,Since.ds_Tick));
  269.     }
  270.     if (ArgArray[ARG_UPTO])
  271.     {
  272.         Zeit.dat_StrDate = ArgArray[ARG_UPTO];
  273.         if (!StrToDate(&Zeit))
  274.         {
  275.             D(bug("StrToDate() fehlgeschlagen (bei ARG_UPTO)\n"));
  276.             PrintFault(ERROR_OBJECT_WRONG_TYPE,PROGRAM "(parsing UPTO/K)");
  277.             DoExit(RETURN_ERROR);
  278.         }
  279.         Zeit.dat_Stamp.ds_Minute = 24*60-1;
  280.         Zeit.dat_Stamp.ds_Tick = TICKS_PER_SECOND-1;
  281.         Upto = Zeit.dat_Stamp;
  282.  
  283.         D2(bug("Upto=={%ld,%ld,%ld}\n",Upto.ds_Days,Upto.ds_Minute,Upto.ds_Tick));
  284.     }
  285.     if (ArgArray[ARG_SINCEDAYS])
  286.     {
  287.         SinceDays = Jetzt;
  288.         SinceDays.ds_Days += *(LONG *)ArgArray[ARG_SINCEDAYS];
  289.  
  290.         D2(bug("SinceDays=={%ld,%ld,%ld}\n",SinceDays.ds_Days,SinceDays.ds_Minute,SinceDays.ds_Tick));
  291.  
  292.     }
  293.     if (ArgArray[ARG_UPTODAYS])
  294.     {
  295.         UptoDays = Jetzt;
  296.         UptoDays.ds_Days += *(LONG *)ArgArray[ARG_UPTODAYS];
  297.  
  298.         D2(bug("UptoDays=={%ld,%ld,%ld}\n",UptoDays.ds_Days,UptoDays.ds_Minute,UptoDays.ds_Tick));
  299.     }
  300.  
  301.     if ((Level = Scan((STRPTR *)ArgArray[ARG_FILE],SIGBREAKF_CTRL_C,Flags,256L))>RETURN_WARN)
  302.         PrintFault(IoErr(),PROGRAM);
  303.  
  304.     DoExit(Level);
  305. }
  306.